#
#   pimento/command.rb - Pimento WebDAV client
#   	$Release Version: 0.0.1$
#   	$Revision: $
#   	$Date: $
#   	by Curl-Ojisan
#

module Pimento

  # Pimentoが実行する全コマンドの基本クラス
  class Command

    # コマンド名を返す
    def self.command_name
      # クラスパス末尾の単語を取り、小文字に直してコマンド名とする
      name.split('::')[-1].downcase
    end

    # 全コマンドクラスを集めた配列を返す
    def self.command_classes
      # Command配下の全定数を処理
      self.constants.map {|c|
        # 定数名を定数に変換
        self.const_get(c)
      }.select {|c|
        # Commandクラスの子孫＝Pimentoのコマンドクラスだけ集める
        c < self and c != self
      }
    end

    # 全コマンド名を集めた配列を返す
    def self.command_names
      # 全コマンドクラスのコマンド名を集める
      command_classes.map {|c| c.command_name }
    end

    # 指定されたコマンド名に該当するコマンドクラスを返す
    def self.get_command_class(cname)
      # 全コマンドクラスの中からコマンド名が一致するものを検索
      command_classes.find {|c| c.command_name == cname.to_s }
    end

    # 指定されたコマンド名に該当するコマンドインスタンスを返す
    def self.get_command_instance(cname, *args)
      # 名称が一致するコマンドクラスのインスタンスを生成して返す
      get_command_class(cname).new(*args)
    end

    #------------------------------------------------------------------
    #------------------------------------------------------------------

    # helpコマンド: ヘルプメッセージを表示する
    class Help < self

      def initialize(cmd)
        @command_name = cmd
      end

      def execute
        case @command_name
        when 'commands' # 全コマンドの一覧を出力
          helps = Command.command_classes.map {|cmd|
            [cmd.command_name, cmd.short_help]
          }
          indent = ((helps.map {|cons| cons[0].length }.max) / 4 + 1) * 4
          helps.each {|cons|
            puts cons[0] + ' ' * (indent - cons[0].length) + cons[1]
          }
        else
          puts Command.get_command_class(@command_name).long_help
        end
      end

      def self.short_help
        'Print help message of specified command'
      end

      def self.long_help
        'Print help message of specified command'
      end

    end

    #------------------------------------------------------------------
    #------------------------------------------------------------------

  end

end

require 'pimento/command/put'

# vi: ts=8 sw=2 tw=72 fenc=utf-8
# END OF FILE
